package dragon.tagext.easyui;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

import dragon.core.util.StringUtils;
import dragon.model.bizObject.BizField;
import dragon.model.bizObject.BizObject;
import dragon.model.bizObject.QueryField;
import dragon.model.fieldTemplate.FieldTemplate;

@SuppressWarnings("serial")
public class Choose extends BodyTagSupport {

	private String js;
	private String html;
	private String dependParamV = "";

	@Override
	public int doStartTag() throws JspException {
		BizObject bizObject = (BizObject) pageContext.getRequest().getAttribute("bizObject");
		FieldTemplate fieldTemplate = (FieldTemplate) pageContext.getRequest().getAttribute("fieldTemplate");
		if (bizObject != null) {
			StringBuffer sb_js = new StringBuffer();
			StringBuffer sb_html = new StringBuffer();

			StringBuffer queryString = new StringBuffer();

			if (bizObject.getDepend() != null) {
				queryString.append("&").append(bizObject.getDependParamK().toUpperCase()).append("=").append(pageContext.getRequest().getParameter(bizObject.getDependParamV().toUpperCase()));
			}
			if (bizObject.getQueryFields() != null) {
				for (QueryField qf : bizObject.getQueryFields()) {
					if (!queryString.toString().contains(qf.getCode().toUpperCase())) {
						String tempParamValue = pageContext.getRequest().getParameter(qf.getCode().toUpperCase());
						if (!StringUtils.isEmpty(tempParamValue)) {
							queryString.append("&").append(qf.getCode().toUpperCase()).append("=").append(tempParamValue);
						}
					}
				}
			}

			// js部分开始
			sb_js.append("$(function(){");
			// 添加用户初始化fun
			sb_js.append("\tif($.isFunction(window.init_before))").append("{init_before();}\n");
			// 配置datagrid属性
			sb_js.append("\t$('#mydatagrid').datagrid({\n\t\turl : 'dragon/model/action/BizObjectHandler/loadData.ejw?bizCode=").append(bizObject.getCode());
			if (queryString.length() > 0) {
				sb_js.append(queryString);
			}
			sb_js.append("',\n");
			sb_js.append("\t\tsingleSelect :").append(fieldTemplate.getMultiple() == 1 ? "false" : "true").append(",\n");
			sb_js.append("\t\tpagination :").append(bizObject.getPagination() == 0 ? "false" : "true").append(",\n");
			sb_js.append("\t\tpageSize :").append(bizObject.getPageSize()).append(",\n");
			sb_js.append("\t\tpageList : [").append(bizObject.getPageList()).append("],\n");
			sb_js.append("\t\tremoteSort :").append(bizObject.getRemoteSort() == 0 ? "false" : "true").append(",\n");
			sb_js.append("\t\trownumbers :").append(bizObject.getRownumbers() == 0 ? "false" : "true").append(",\n");
			// 配置结束

			// 绘制锁定列开始
			java.util.List<BizField> frozen = bizObject.getBizFieldsBind().get("FROZEN");
			if (frozen != null && !frozen.isEmpty()) {
				sb_js.append("\t\tfrozenColumns:[[\n");
				if (fieldTemplate.getMaximize() == 1)
					sb_js.append("\t\t\t{checkbox : true},\n");
				for (BizField bf : frozen) {
					sb_js.append("\t\t\t{");
					sb_js.append("field: '").append(bf.getCode().toUpperCase()).append("',");
					sb_js.append("title: '").append(bf.getName()).append("',");
					sb_js.append("width: ").append(bf.getWidth()).append(",");
					sb_js.append("sortable :").append(bf.getSortable() == 0 ? "false" : "true");
					sb_js.append("},\n");
				}
				sb_js.deleteCharAt(sb_js.lastIndexOf(","));
				sb_js.append("\t\t]],\n");
			}
			// 绘制锁定列结束

			// 绘制普通列开始
			sb_js.append("\t\tcolumns : [[\n");
			if ((frozen == null || frozen.isEmpty()) && fieldTemplate.getMultiple() == 1)
				sb_js.append("\t\t\t{checkbox : true},\n");
			java.util.List<BizField> nofrozen = bizObject.getBizFieldsBind().get("NONFROZEN");
			for (BizField bf : nofrozen) {
				String width = bf.getWidth();
				sb_js.append("\t\t\t{");
				sb_js.append("field: '").append(bf.getCode().toUpperCase()).append("',");
				sb_js.append("title: '").append(bf.getName()).append("',");
				sb_js.append("sortable :").append(bf.getSortable() == 0 ? "false" : "true").append(",");
				sb_js.append("hidden :").append(bf.getIsVisible() == 1 ? "false" : "true");
				if (bf.getFormatter() != null) {
					sb_js.append(",formatter:function(value,rowData,rowIndex){").append(bf.getFormatter()).append("}");
				}
				if (bf.getFormatter() == null && bf.getFieldTemplate() != null) {
					switch (bf.getFieldTemplate().getType()) {
					case DATE:
						width = "80";
						sb_js.append(",formatter:function(value,rowData,rowIndex){return fmtDateStr(value);}");
						break;
					case TIME:
						width = "60";
						sb_js.append(",formatter:function(value,rowData,rowIndex){return fmtTimeStr(value);}");
						break;
					case DATETIME:
						width = "120";
						sb_js.append(",formatter:function(value,rowData,rowIndex){return fmtDateTimeStr(value);}");
						break;
					case FILE:
						sb_js.append(",formatter:function(value,rowData,rowIndex){return getFiles(value);}");
						break;
					case RADIO:
						sb_js.append(",formatter:function(value,rowData,rowIndex){return getValuesText('").append(bf.getFieldTemplate().getOptions() == null ? "" : bf.getFieldTemplate().getOptions())
								.append("',value);}");
						break;
					case CHECKBOX:
						sb_js.append(",formatter:function(value,rowData,rowIndex){return getValuesText('").append(bf.getFieldTemplate().getOptions() == null ? "" : bf.getFieldTemplate().getOptions())
								.append("',value);}");
						break;
					default:
						if (!StringUtils.isEmpty(bf.getFieldTemplate().getOptions())) {
							sb_js.append(",formatter:function(value,rowData,rowIndex){return getValuesText('")
									.append(bf.getFieldTemplate().getOptions() == null ? "" : bf.getFieldTemplate().getOptions()).append("',value);}");
						}
						break;
					}
				}
				sb_js.append(",width: ").append(width);
				sb_js.append("},\n");
			}
			sb_js.deleteCharAt(sb_js.lastIndexOf(","));
			sb_js.append("\t\t]],\n");
			// 绘制普通列结束

			// 添加toolbar
			sb_js.append("\t\ttoolbar : [\n");
			sb_js.append("\t\t\t{text : '选择',iconCls : 'icon-ok',handler : function() {\n");

			// 判断用户是否自定义方法，并添加默认方法
			sb_js.append("\t\t\t\tif($.isFunction(window.my_choose))").append("{\n\t\t\t\t\tmy_choose();\n\t\t\t\t}");
			sb_js.append("else{\n");

			sb_js.append("\t\t\t\t\tchoose();\n");
			sb_js.append("\t\t\t\t}\n");
			sb_js.append("\t\t\t}}");
			sb_js.append("\n\t\t],\n");
			// 添加toolbar结束

			sb_js.append("\t\tonLoadError : function() {top.showErrorMsg(\"出错了\", \"加载数据遇到错误，请稍后重试！\");},\n");

			sb_js.append("\t\tonLoadSuccess : function(data) {if(data.errors!=undefined&&data.errors!=null){top.showErrorMsg(\"出错了\", \"加载数据遇到错误！\"+data.errors);}if(data.sessiontimeout!=undefined&&data.sessiontimeout==true){top.showMsg(\"出错了\", \"会话已过期，请按 &lt;F5&gt; 刷新页面并重新登录到系统！\",true);}},\n");

			sb_js.append("\t\tonClickRow : function(rowIndex, rowData) {if($.isFunction(window.clickRow)){clickRow(rowIndex, rowData);}else{}}\n");

			sb_js.append("\t});\n");// datagrid结束

			// 添加搜索项位置
			if (bizObject.getQueryFields() != null && !bizObject.getQueryFields().isEmpty())
				sb_js.append("\t$(\".datagrid-toolbar\").append($(\"#datagridsearch\"));\n\t").append("$(\".datagrid-toolbar\").css(\"height\", \"auto\");\n");

			// 模板处理
			if (bizObject.getQueryFields() != null && !bizObject.getQueryFields().isEmpty()) {
				sb_js.append("\tvar value=\"\" ;");
				for (QueryField qf : bizObject.getQueryFields()) {
					if (qf.getFieldTemplate() != null && qf.getFieldTemplate().getType() != null) {
						switch (qf.getFieldTemplate().getType()) {
						case DATE:
							sb_js.append("\t$('#").append(qf.getCode().toUpperCase()).append("').datebox({");
							sb_js.append("formatter : function(date) {");
							sb_js.append("return date.Format(\"").append(qf.getFieldTemplate().getFormat()).append("\");");
							sb_js.append("}").append("});\n");
							break;
						case DATETIME:
							sb_js.append("\t$('#").append(qf.getCode().toUpperCase()).append("').datebox({");
							sb_js.append("formatter : function(date) {");
							sb_js.append("return date.Format(\"").append(qf.getFieldTemplate().getFormat()).append("\");");
							sb_js.append("}").append("});\n");
							break;
						case SELECT:
							sb_js.append("\t$('#").append(qf.getCode().toUpperCase()).append("').combotree({");
							sb_js.append("onBeforeSelect : function(node) {");
							sb_js.append("if(node.state!=undefined&&").append(qf.getFieldTemplate().getOnlyLeafSelect() == 1 ? "true" : "false").append("){return false;}},");
							sb_js.append("onLoadSuccess : function(node, data) {");
							sb_js.append("var tree = $('#").append(qf.getCode().toUpperCase()).append("').combotree('tree');");
							sb_js.append("var roots = tree.tree('getRoots');");
							sb_js.append("for ( var i = roots.length - 1; i >= 0; i--) {tree.tree('expandAll', roots[i].target);}roots = null;	tree = null;");
							sb_js.append("}});\n");
							break;
						default:
							break;
						}
					}
				}
			}

			// 添加用户初始化fun
			sb_js.append("\tif($.isFunction(window.init_after))").append("{init_after();}\n");

			sb_js.append("});\n");// 初始化函数结束

			// 修改底层方法
			sb_js.append("function modBase(params){\n\tvar windowID = '").append(queryString == null || queryString.equals("") ? "DefaultMod" : "ModSlave").append("';\n");

			sb_js.append("\t\ttop.showWindow(windowID,\"修改").append(bizObject.getName()).append("\",\"").append("dragon/model/action/BizObjectHandler/preMod.ejw?bizCode=").append(bizObject.getCode())
					.append("&").append("\"+params,");
			sb_js.append(bizObject.getModWindowWidth()).append(", ").append(bizObject.getModWindowHeight()).append(",").append(bizObject.getMaximizable()).append(",").append(bizObject.getMaximize())
					.append(");\n}\n");

			if (bizObject.getQueryFields() != null && !bizObject.getQueryFields().isEmpty()) {

				// 添加默认搜索方法
				sb_js.append("function defaultQuery(){\n");
				sb_js.append("\tif($.isFunction(window.query))").append("{\n\t\tquery();\n\t}");
				sb_js.append("else{\n");
				sb_js.append("\t\tvar params = {");
				for (QueryField qf : bizObject.getQueryFields()) {

					if (qf.getFieldTemplate() == null) {
						sb_js.append(qf.getCode().toUpperCase()).append(": $('#").append(qf.getCode().toUpperCase()).append("').val()").append(",");
					} else if (qf.getFieldTemplate().getType().name().equals("TIME")) {
						sb_js.append(qf.getCode().toUpperCase()).append(": $('#").append(qf.getCode().toUpperCase()).append("').timespinner('getValue').trim()").append(",");
					} else if (qf.getFieldTemplate().getType().name().equals("DATETIME") || qf.getFieldTemplate().getType().name().equals("DATE")) {
						sb_js.append(qf.getCode().toUpperCase()).append(": $('#").append(qf.getCode().toUpperCase()).append("').")
								.append(qf.getFieldTemplate().getType().name().equals("DATE") ? "datebox" : "datetimebox").append("('getValue')").append(",");
					} else if (qf.getFieldTemplate().getType().name().equals("SELECT")) {
						sb_js.append(qf.getCode().toUpperCase()).append(": $('#").append(qf.getCode().toUpperCase()).append("').combotree('")
								.append(qf.getFieldTemplate().getMultiple() == 0 ? "getValue" : "getValues").append("')").append(qf.getFieldTemplate().getMultiple() == 1 ? ".join(\",\")" : "")
								.append(".trim(),");
					} else if (qf.getFieldTemplate().getType().name().equals("RADIO") || qf.getFieldTemplate().getType().name().equals("CHECKBOX")) {
						sb_js.append(qf.getCode().toUpperCase()).append(": $('#").append(qf.getCode().toUpperCase()).append("').combobox('")
								.append(qf.getFieldTemplate().getMultiple() == 0 ? "getValue" : "getValues").append("')").append(qf.getFieldTemplate().getMultiple() == 1 ? ".join(\",\")" : "")
								.append(".trim(),");
					}

				}
				sb_js.deleteCharAt(sb_js.lastIndexOf(","));
				sb_js.append("};\n");
				sb_js.append("\t\t$(\"#mydatagrid\").datagrid('options').url = 'dragon/model/action/BizObjectHandler/loadData.ejw?bizCode=" + bizObject.getCode() + "';\n");
				sb_js.append("\t\t$(\"#mydatagrid\").datagrid('options').queryParams = params;\n");
				sb_js.append("\t\t$(\"#mydatagrid\").datagrid('reload');\n");
				sb_js.append("\t}\n");
				sb_js.append("}\n");

				// 添加默认清空搜索方法

				sb_js.append("function defaultClear(){\n");
				sb_js.append("\tif($.isFunction(window.clear))").append("{\n\t\tclear();\n\t}");
				sb_js.append("else{\n");
				for (QueryField qf : bizObject.getQueryFields()) {
					boolean flag = true;
					if (bizObject.getDepend() != null && qf.getCode().toUpperCase().equals(bizObject.getDependParamK())) {
						flag = false;
					}
					if (flag && qf.getIsReadonly() == 0) {
						if (qf.getFieldTemplate() == null) {
							sb_js.append("\t\t$('#").append(qf.getCode().toUpperCase()).append("').val(\"\");\n");
						} else if (qf.getFieldTemplate().getType().name().equals("DATETIME") || qf.getFieldTemplate().getType().name().equals("DATE")) {
							sb_js.append("\t\t$('#").append(qf.getCode().toUpperCase()).append("').datebox('setValue','');\n");
						} else if (qf.getFieldTemplate().getType().name().equals("TIME")) {
							sb_js.append("\t\t$('#").append(qf.getCode().toUpperCase()).append("').timespinner('clear');\n");
						} else if (qf.getFieldTemplate().getType().name().equals("SELECT")) {
							sb_js.append("\t\t$('#").append(qf.getCode().toUpperCase()).append("').combotree('setValue','');\n");
						} else if (qf.getFieldTemplate().getType().name().equals("RADIO") || qf.getFieldTemplate().getType().name().equals("CHECKBOX")) {
							sb_js.append("\t\t$('#").append(qf.getCode().toUpperCase()).append("').combobox('setValue','');\n");
							sb_js.append("\t\t$('#").append(qf.getCode().toUpperCase()).append("').combobox('setText','');\n");
						}
					}
				}
				sb_js.append("\t\tdefaultQuery();\n");
				sb_js.append("\t}\n");
				sb_js.append("}");

			}
			sb_js.append("function choose() {\n\tvar rows = $('#mydatagrid').datagrid('getSelections');\n\tif ('").append(fieldTemplate.getMultiple()==1).append("' == 'true') {\n");
			sb_js.append("\t\tif (rows.length > 0) {\n\t\t\tdoChooseMutiple(rows);\n\t\t} else {\n\t\t\ttop.showMsg(\"\", \"请选择数据！\", true);\n\t\t}\n");
			sb_js.append("\t} else {\n\t\tif (rows.length == 1) {\n\t\t\tdoChoose(rows[0]);\n\t\t} else {\n\t\ttop.showMsg(\"\", \"请选择一行数据！\", true);\n\t\t}\n\t}\n}\n");
			sb_js.append("function doChoose(row) {\n\ttry {\n\t\tvar result = new Object();\n");
			sb_js.append("\t\tresult.value = row.").append(fieldTemplate.getValueField().toUpperCase()).append(";\n");
			sb_js.append("\t\tresult.text = row.").append(fieldTemplate.getTextField().toUpperCase()).append(";\n");
			sb_js.append("\t\ttop.getWindow('").append(pageContext.getRequest().getParameter("parentWindowID")).append("').doChoose('").append(pageContext.getRequest().getParameter("fieldCode"))
					.append("',result);\n");
			sb_js.append("\t\ttop.closeWindow('Choose'); \n\t} catch (e) {\n\t\t top.showMsg(\"\", e, true);\n\t }\n }\n");
			sb_js.append("function doChooseMutiple(rows) {\n\ttry {\n\t\tvar results = new Array(rows.length);\n\t\tfor(var i=0;i<rows.length;i++){\n\t\t\tvar result = new Object();\n");
			sb_js.append("\t\t\tresult.value = rows[i].").append(fieldTemplate.getValueField().toUpperCase()).append(";\n");
			sb_js.append("\t\t\tresult.text = rows[i].").append(fieldTemplate.getTextField().toUpperCase()).append(";\n");
			sb_js.append("\t\t\tresults[i]=result;\n\t\t}\n");
			sb_js.append("\t\ttop.getWindow('").append(pageContext.getRequest().getParameter("parentWindowID")).append("').doChooseMutiple('").append(pageContext.getRequest().getParameter("fieldCode"))
					.append("',results);\n");
			sb_js.append("\t\ttop.closeWindow('Choose');\n");
			sb_js.append("\t} catch (e) {\n");
			sb_js.append("\t\ttop.showMsg(\"\", e, true);\n");
			sb_js.append("\t}\n}\n");

			// js部分结束

			// html部分处理开始
			sb_html.append("<div id=\"mydatagrid\" fit=\"true\"></div>");
			if (bizObject.getQueryFields() != null && !bizObject.getQueryFields().isEmpty()) {
				sb_html.append("<div id=\"datagridsearch\" class=\"datagridsearch\">");
				for (QueryField qf : bizObject.getQueryFields()) {
					boolean isDependParamK = false;
					if (bizObject.getDepend() != null && qf.getCode().equalsIgnoreCase(bizObject.getDependParamK())) {
						dependParamV = pageContext.getRequest().getParameter(bizObject.getDependParamV().toUpperCase());
						isDependParamK = true;
					}
					String paramValue = pageContext.getRequest().getParameter(qf.getCode().toUpperCase());
					boolean readonly = false;
					if (!StringUtils.isEmpty(paramValue)) {
						readonly = true;
					} else {
						paramValue = "";
					}

					sb_html.append("<p>");
					sb_html.append("<label>").append(qf.getName()).append(":</label>");
					if (qf.getFieldTemplate() == null) {
						sb_html.append("<input type=\"text\" id=\"").append(qf.getCode().toUpperCase()).append("\" style=\"width: 146px;\" class=\"easyui-validatebox\"")
								.append(readonly ? " readonly " : "").append(" value=\"").append(isDependParamK ? dependParamV : paramValue).append("\" />");
					} else if (qf.getFieldTemplate().getType().name().equals("DATETIME") || qf.getFieldTemplate().getType().name().equals("DATE")) {
						sb_html.append("<input type=\"text\" id=\"").append(qf.getCode().toUpperCase()).append("\" style=\"width: 150px;\" class=\"easyui-")
								.append(qf.getFieldTemplate().getType().name().equals("DATE") ? "datebox" : "datetimebox").append("\" readonly=\"readonly\"").append(readonly ? " disabled " : "")
								.append("  value=\"").append(isDependParamK ? dependParamV : paramValue).append("\" ").append(isDependParamK ? " disabled " : "").append(" />");
					} else if (qf.getFieldTemplate().getType().name().equals("TIME")) {
						sb_html.append("<input type=\"text\" id=\"").append(qf.getCode().toUpperCase())
								.append("\" style=\"width: 150px;\" class=\"easyui-timespinner\" showSeconds=\"true\"  editable=\"true\"").append(readonly ? " disabled " : "").append("  value=\"")
								.append(isDependParamK ? dependParamV : paramValue).append("\" ").append(isDependParamK ? " disabled " : "").append(" />");
					} else if (qf.getFieldTemplate().getType().name().equals("SELECT")) {
						sb_html.append("<input type=\"text\" id=\"")
								.append(qf.getCode().toUpperCase())
								.append("\" style=\"width: 150px;\" class=\"easyui-combotree\"  url=\"dragon/model/action/FieldTemplateHandler/loadData.ejw?bizCode=" + bizObject.getCode() + "&"
										+ queryString + "&queryfield=" + qf.getCode().toUpperCase() + "&root=").append(qf.getFieldTemplate().getDicRoot()).append("\" ")
								.append(qf.getFieldTemplate().getMultiple() == 1 ? "multiple" : "").append(isDependParamK ? " disabled " : "").append(readonly ? " disabled " : "")
								.append("  value=\"").append(isDependParamK ? dependParamV : paramValue).append("\" />");
					} else if (qf.getFieldTemplate().getType().name().equals("RADIO") || qf.getFieldTemplate().getType().name().equals("CHECKBOX")) {
						sb_html.append("<input type=\"text\" id=\"")
								.append(qf.getCode().toUpperCase())
								.append("\" style=\"width: 150px;\" class=\"easyui-combobox\"  valueField=\"VALUE\" textField=\"TEXT\" url=\"dragon/model/action/FieldTemplateHandler/loadData.ejw?bizCode=")
								.append(bizObject.getCode()).append("&").append(queryString).append("&queryfield=").append(qf.getCode().toLowerCase()).append("\" ")
								.append(qf.getFieldTemplate().getMultiple() == 1 ? "multiple" : "").append(isDependParamK ? " disabled " : "").append(readonly ? " disabled " : "")
								.append("  value=\"").append(isDependParamK ? dependParamV : paramValue).append("\" />");
					}
					sb_html.append("</p>");
				}
				sb_html.append("<p>");
				sb_html.append("<a href=\"javascript:void(0);\" onclick=\"defaultQuery();\" class=\"easyui-linkbutton\" plain=\"true\" iconCls=\"icon-search\">检索</a>");
				sb_html.append("<a href=\"javascript:void(0);\" class=\"easyui-linkbutton\" plain=\"true\" iconCls=\"icon-remove\" onclick=\"defaultClear();\">清空所有</a>");
				sb_html.append("</p>");
				sb_html.append("</div>");

			}
			// html部分处理结束

			js = sb_js.toString();
			html = sb_html.toString();

		} else {
			js = "$(function(){top.showMsg(\"\", \"未发现数据模型！\", false);});";
			html = "<font color=\"red\">未发现模型：</font>";
		}
		try {
			pageContext.setAttribute("js", js);
			pageContext.setAttribute("html", html);
		} catch (Exception e) {
			throw new JspException(e);
		}

		return EVAL_BODY_INCLUDE;
	}

	public String getJs() {
		return js;
	}

	public void setJs(String js) {
		this.js = js;
	}

	public String getHtml() {
		return html;
	}

	public void setHtml(String html) {
		this.html = html;
	}

}
